/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cda.pager;

import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 * Classe permettant de gérer la base de données joueur. Cette base de
 * données<br> contient les infos relatives aux joueurs inscrits.
 *
 * @author Shyzkanza
 */
public class ClientBDD {

    private Document document;
    private Element racine;

    /**
     * Fonction permettant d'ouvrir le fichier. Elle initialise la variable
     * document avec le fichier XML complet et racine avec l'element racine du
     * document XML.
     *
     * @author Jessy Bonnotte
     */
    private void Ouverture(String nomDoc) {
        SAXBuilder sxb = new SAXBuilder();
        try {
            document = sxb.build(new File("/sdcard/cda.memo/" + nomDoc + ".xml"));
        } catch (Exception e) {
            System.err.println(e.toString());
        }
        racine = document.getRootElement();
    }

    /**
     * Enregistre le fichier XML.
     *
     * @author Jessy Bonnotte
     */
    private void Enregistre(String nomDoc) {
        try {
            XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
            sortie.output(document, new FileOutputStream("/sdcard/cda.memo/" + nomDoc + ".xml"));
        } catch (java.io.IOException e) {
            System.err.println(e.toString());
        }
    }

    /**
     * Fonction permettant d'ajouter une categorie dans la base de données. Elle
     * prend en parametre le nom de la cat�gorie. Le numero de categorie est
     * auto-incremente.
     *
     * @author Jessy Bonnotte
     *
     * @param nomCat nom de la cat�gorie a ajouter dans la base
     *
     * @return {@code String} l'identifiant de la nouvelle categorie
     */
    public String addCategorie(String nomCat) {
        Ouverture("Categorie");
        String nb;
        Element temp = null;

        if (racine.getChildren().isEmpty()) {
            nb = "1";
        } else {
            List element = racine.getChildren("categorie");
            temp = (Element) element.get(element.size() - 1);

            nb = String.valueOf(Integer.parseInt(temp.getAttributeValue("id")) + 1);
        }
        temp = new Element("categorie");
        temp.setAttribute("nom", nomCat);
        temp.setAttribute("id", nb);
        racine.addContent(temp);
        Enregistre("Categorie");
        return nb;
    }

    /**
     * Fonction permettant d'ajouter un item dans la base de données. Elle prend
     * en parametre le nom de l'item. Ainsi que la cle de la categorie La cle de
     * l'item est generer automatiquement
     *
     * @author Damien Henry
     *
     * @param cat cle de la categorie dans laquel ajouter l'item
     * @param donnee les information de l'item a enregistrer
     *
     * @return {@code String} contenant le résultat de l'opération
     */
    public boolean addItem(String cat, String[] donnee) {
        Ouverture("Categorie");
        Element temp = null;

        List element = racine.getChildren("categorie");

        for (int i = 0; i < element.size(); i++) {
            temp = (Element) element.get(i);
            if (temp.getAttributeValue("id").equals(cat)) {
                break;
            }
        }
        List tem = temp.getChildren();

        String id = cat + 1;
        int nb = 0;
        if (!tem.isEmpty()) {
            Element last = (Element) tem.get(tem.size() - 1);
            id = Integer.parseInt(last.getAttributeValue("id")) + 1 + "";
        }
        
        Element nouveau = new Element("item");
        nouveau.setAttribute("id", id);
        nouveau.setAttribute("nom", donnee[0]);
        nouveau.setAttribute("reference", donnee[1]);
        nouveau.setAttribute("garantie", donnee[2]);
        nouveau.setAttribute("lieudachat", donnee[3]);
        nouveau.setAttribute("dateachat", donnee[4]);
        temp.addContent(nouveau);

        Enregistre("Categorie");
        return true;
    }

    /**
     * Fonction permettant de récupérer les items d'une categorie.
     *
     * @author Damien Henry
     *
     * @return {@code List<String[]>} liste contenant les categories
     */
    public List<String[]> getItem(String[] cat) {
        List<String[]> retour = new ArrayList<String[]>();

        Ouverture("Categorie");

        List element = racine.getChildren("categorie");
        Element temp;

        for (int i = 0; i < element.size(); ++i) {
            temp = (Element) element.get(i);
            if (temp.getAttributeValue("id").equals(cat[0])) {
                List ite = temp.getChildren();
                for (int j = 0; j < ite.size(); ++j) {
                    Element tmp = (Element) ite.get(j);
                    String[] donnee = new String[6];
                    donnee[0] = tmp.getAttributeValue("id");
                    donnee[1] = tmp.getAttributeValue("nom");
                    donnee[2] = tmp.getAttributeValue("reference");
                    donnee[3] = tmp.getAttributeValue("garantie");
                    donnee[4] = tmp.getAttributeValue("lieudachat");
                    donnee[5] = tmp.getAttributeValue("dateachat");
                    retour.add(donnee);
                }
            }
        }
        return retour;
    }

    /**
     * Fonction permettant de récupérer les categories.
     *
     * @author Jessy Bonnotte
     *
     * @return {@code List<String[]>} liste contenant les categories
     */
    public List<String[]> getCategorie() {
        Ouverture("Categorie");
        List<String[]> retour = new ArrayList<String[]>();

        List element = racine.getChildren("categorie");
        Element temp;

        for (int i = 0; i < element.size(); i++) {
            temp = (Element) element.get(i);
            String[] tmp = new String[2];
            tmp[0] = temp.getAttributeValue("id");
            tmp[1] = temp.getAttributeValue("nom");
            retour.add(tmp);
        }
        return retour;
    }

    /**
     *
     *
     */
    public boolean modifItem(String cat, String[] donnee) {
        Ouverture("Categorie");
        Element temp = null;

        List element = racine.getChildren("categorie");

        for (int i = 0; i < element.size(); i++) {
            temp = (Element) element.get(i);
            if (temp.getAttributeValue("id").equals(cat)) {
                List ite = temp.getChildren();
                for (int j = 0; j < ite.size(); ++j) {
                    Element tmp = (Element) ite.get(j);
                    if (tmp.getAttributeValue("id").equals(donnee[0])) {
                        tmp.getAttribute("nom").setValue(donnee[1]);
                        tmp.getAttribute("reference").setValue(donnee[2]);
                        tmp.getAttribute("garantie").setValue(donnee[3]);
                        tmp.getAttribute("lieudachat").setValue(donnee[4]);
                        tmp.getAttribute("dateachat").setValue(donnee[5]);
                    }
                }
            }
        }
        Enregistre("Categorie");
        return true;
    }
}
